package bancosys.tec.security.impl;

import bancosys.tec.persist.controller.TransactionalController;
import bancosys.tec.security.impl.dao.UserAccessDataDAO;
import bancosys.tec.security.impl.domain.UserAccessData;
import bancosys.tec.utils.date.Timestamp;

/**
 * Classe auxiliar para efetuar log de acesso de usuários.
 * 
 * @author piercio
 */
public class UserDataLogger {

    private TransactionalController controller;

    private UserAccessDataDAO userAccessDataDAO;

    /**
     * Adiciona um registro de login de acesso de usuário.
     * 
     * @param username nome do usuário.
     * @param sessionId id da sessão.
     * @param clientName nome do sistema cliente.
     */
    public void login(String username, String sessionId, String clientName) {
        this.controller.startTransaction();
        try {
            UserAccessData userData = this.getDAO().createBean();
            userData.setUsername(username);
            userData.setSessionId(sessionId);
            userData.setClientName(clientName);
            userData.setLoginTimestamp(new Timestamp());
            userData.getPersister().save();
        } finally {
            this.controller.commit();
        }
    }

    /**
     * Adiciona um registro de logout de acesso de usuário.
     * 
     * @param username nome do usuário.
     * @param sessionId id da sessão.
     * @param clientname nome da aplicação cliente.
     */
    public void logout(String username, String sessionId, String clientname) {
        this.controller.startTransaction();
        try {
            UserAccessData userData = this.getDAO().findByUsername(username, sessionId, clientname);
            userData.setLogoutTimestamp(new Timestamp());
            userData.getPersister().save();
        } catch (Exception e) {
            this.controller.rollback();
        } finally {
            this.controller.commit();
        }
    }

    /**
     * @param controller o valor para o campo controller
     */
    public void setController(TransactionalController controller) {
        this.controller = controller;
    }

    /**
     * @return o dao de UserAccessData
     */
    public UserAccessDataDAO getDAO() {
        if (this.userAccessDataDAO == null) {
            this.userAccessDataDAO = this.controller.getDAOFactory().getDAOByClass(UserAccessDataDAO.class);
        }
        return this.userAccessDataDAO;
    }
}
